
Statistically Analyzing the G.O.A.T. Debate
Abstract
Overall Purpose of
My Study
The Greatest of All Time (G.O.A.T.) discussion is an age old debate
typically involving superstars LeBron James and Michael Jordan who each
dominated in their respective eras of the NBA. Each considered the
greatest of THEIR time, fans have long contested which is the greatest
of ALL time. This is my attempt to finally settle this debate with
statistics!
Basic Design of My
Study
For this analysis, I performed a Two Sample t-test (Independent
Samples). The observation of interest is points-per-game scored by each
player during their respective careers. The basis of my study is to
simply determine if the mean points scored per game by both players
differ significantly, and therefore determine which player made the
larger impact.
Major Findings +
Short Summary of My Study
As an avid fan of sports and the NBA in particular, my favorite
player between the two is Michael Jordan. However, I approached this
analysis fairly and objectively to statistically prove which player is
the greatest of all time based on the significance of mean
points-per-game scored. By conducting the Two Sample t-test, it was
determined that Michael Jordan indeed had a significantly higher mean
points-per-game scored over his career than LeBron James currently has.
With a p-value (0.00) less than any reasonable alpha level, it is
determined that Michael Jordan is officially the G.O.A.T. of
professional basketball!
Introduction
Question of
Interest
LeBron James vs. Michael Jordan who is the Greatest of All Time
(G.O.A.T)?
Why Should You Be
Interested?
There can be many greats, but only one absolute greatest of all time.
For my NBA fans, this is a fun debatable topic that I felt would be fun
to analyze statistically.
How I Plan to
Address this Question
I will utilize career stats for both LeBron James and Michael Jordan
to perform a Two Sample t-test.
Data Management
Data Collection
Method
From the above links, I copied the statistics for each game that the
player played. I ignored games where the player was injured or inactive
because they are not physically contributing to the game.
Import Raw Data
LeBron James Career
Stats:
lebron = read_excel("LEBRON_STATS.xlsx", skip = 1)
datatable(lebron)
Michael Jordan
Career Stats:
mj = read_excel("MJ_STATS.xlsx", skip = 1)
datatable(mj)
Select Game Number
and PTS (Points)
LeBron James Points
Per Game (PPG)
#Select Game_Number and PTS
lebron_pts = lebron %>%
select(G, PTS) %>%
na.omit() %>%
summarise(Game_Number = G,
LEBRON_PTS = PTS)
datatable(lebron_pts)
Michael Jordan
Points Per Game (PPG)
#Select Game_Number and PTS
mj_pts = mj %>%
select(G, PTS) %>%
na.omit() %>%
summarise(Game_Number = G,
MJ_PTS = PTS)
datatable(mj_pts)
Join by Game Number
To Get Final Data Table
#inner join to include only the games that each played
pts = inner_join(mj_pts, lebron_pts, by = "Game_Number") %>%
select(-Game_Number)
datatable(pts)
Descriptive
Statistics
Pivot Data
#Pivot the data
pts_pivot = pts %>%
pivot_longer("LEBRON_PTS":"MJ_PTS",names_to = "Player", values_to = "PTS")
datatable(pts_pivot)
Summary
Statistics
#Gather summary statistics
pts_summary = pts_pivot %>%
group_by(Player) %>%
summarise(n = n(),
mean = mean(PTS, na.rm = TRUE),
sd = sd(PTS, na.rm = TRUE))
knitr::kable(pts_summary)
| LEBRON_PTS |
1020 |
27.17745 |
7.946020 |
| MJ_PTS |
1020 |
30.22059 |
9.805436 |
This study analyzes 1020 games played by LeBron James and Michael
Jordan. The mean points-per-game scored by LeBron is approximately 27.18
and Michael’s is 30.22. From a surface level view, it is clear that
Michael had a higher average points-per-game scored, but the question
remains: is it a statistically significant difference? In the context of
a basketball game, a 3 point deficit is a small margin. However, in the
context of statistics, the significance is yet to be determined. Next we
will visualize the data to get a better understanding of the
distribution.
Data
Visualizations
Histogram
#histogram
hist <- pts_pivot %>%
ggplot(mapping=aes(x = PTS, fill=Player)) +
geom_histogram(binwidth = 5)
hist

From the histogram, it is clear that although Michael Jordan has a
slightly higher mean points-per-game than LeBron James, LeBron has a
much higher point total than Michael throughout the sample 1020 games.
This raises the question: How could LeBron have more total points but a
smaller mean overall? This is because the data analyzes points-per-game,
not total points scored. This indicates that LeBron may have many
outliers (games where he scored much more or much less than normal).
Therefore we can conclude that LeBron has scored much more points
overall, but on a per-game basis, Michael Jordan has the higher average
point total.
Boxplot
# boxplot
bp <- pts_pivot %>%
ggplot(mapping=aes(x=PTS, fill=Player)) +
geom_boxplot(outlier.color = "#F56600",
outlier.size = 3.0)
bp

A similar conclusion can be drawn from the boxplot. What we can
clearly see is the high number of outliers for LeBron’s point totals
which could be skewing the data. These outliers are reasonable within
the context of basketball because player performance varies throughout
the season due to numerous external factors. However, it is still clear
that Michael Jordan retains the higher mean points-per-game. This is
important to note because LeBron James played more games total than
Michael Jordan so analyzing mean points-per-game is a more accurate
representation than simply total points scored.
QQPlot
# qq plot
ggqqplot(pts_pivot, x="PTS", facet.by = "Player")

The QQPlot confirms that both datasets follow an approximiately
normal distribution. There is insufficient evidence to suggest
otherwise.
Summary
A two-sample t-test was computed to determine whether the population
mean points-per-game by Michael Jordan was significantly higher from the
population mean points-per-game by LeBron James.
Since the p-value (0) is less than any reasonable alpha level, we
reject our null hypothesis. There IS sufficient evidence to suggest that
the population mean points-per-game scored by Michael Jordan is
significantly greater than the population mean points-per-game scored by
LeBron James.

LS0tDQp0aXRsZTogJ0xlQnJvbiBKYW1lcyB2cy4gTWljaGFlbCBKb3JkYW4nDQpzdWJ0aXRsZTogIkxldCdzIEZpbmFsbHkgU2V0dGxlIHRoZSBHLk8uQS5ULiBEZWJhdGUhIg0KYXV0aG9yOiAiRGVycmljayBKb3ljZSINCmRhdGU6ICIyMDIzLTA0LTEzIg0Kb3V0cHV0Og0KICAgIGh0bWxfZG9jdW1lbnQ6DQogICAgICAjY3NzOiBib290c3RyYXAubWluLmNzcw0KICAgICAgdGhlbWU6IGpvdXJuYWwNCiAgICAgIGRmX3ByaW50OiBwYWdlZA0KICAgICAgdG9jOiBUUlVFDQogICAgICB0b2NfZGVwdGg6IDINCiAgICAgIHRvY19mbG9hdDogVFJVRQ0KICAgICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFDQogICAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KPGNlbnRlcj4NCg0KIVtdKE1KLWFuZC1MQkouanBnKXt3aWR0aD0xMDAlfQ0KDQo8L2NlbnRlcj4NCg0KIyBTdGF0aXN0aWNhbGx5IEFuYWx5emluZyB0aGUgRy5PLkEuVC4gRGViYXRlIHsudGFic2V0fQ0KDQojIyBBYnN0cmFjdA0KDQojIyMgT3ZlcmFsbCBQdXJwb3NlIG9mIE15IFN0dWR5DQoNClRoZSBHcmVhdGVzdCBvZiBBbGwgVGltZSAoRy5PLkEuVC4pIGRpc2N1c3Npb24gaXMgYW4gYWdlIG9sZCBkZWJhdGUgdHlwaWNhbGx5IGludm9sdmluZyBzdXBlcnN0YXJzIExlQnJvbiBKYW1lcyBhbmQgTWljaGFlbCBKb3JkYW4gd2hvIGVhY2ggZG9taW5hdGVkIGluIHRoZWlyIHJlc3BlY3RpdmUgZXJhcyBvZiB0aGUgTkJBLiBFYWNoIGNvbnNpZGVyZWQgdGhlIGdyZWF0ZXN0IG9mIFRIRUlSIHRpbWUsIGZhbnMgaGF2ZSBsb25nIGNvbnRlc3RlZCB3aGljaCBpcyB0aGUgZ3JlYXRlc3Qgb2YgQUxMIHRpbWUuIFRoaXMgaXMgbXkgYXR0ZW1wdCB0byBmaW5hbGx5IHNldHRsZSB0aGlzIGRlYmF0ZSB3aXRoIHN0YXRpc3RpY3MhDQoNCiMjIyBCYXNpYyBEZXNpZ24gb2YgTXkgU3R1ZHkNCg0KRm9yIHRoaXMgYW5hbHlzaXMsIEkgcGVyZm9ybWVkIGEgVHdvIFNhbXBsZSB0LXRlc3QgKEluZGVwZW5kZW50IFNhbXBsZXMpLiBUaGUgb2JzZXJ2YXRpb24gb2YgaW50ZXJlc3QgaXMgcG9pbnRzLXBlci1nYW1lIHNjb3JlZCBieSBlYWNoIHBsYXllciBkdXJpbmcgdGhlaXIgcmVzcGVjdGl2ZSBjYXJlZXJzLiBUaGUgYmFzaXMgb2YgbXkgc3R1ZHkgaXMgdG8gc2ltcGx5IGRldGVybWluZSBpZiB0aGUgbWVhbiBwb2ludHMgc2NvcmVkIHBlciBnYW1lIGJ5IGJvdGggcGxheWVycyBkaWZmZXIgc2lnbmlmaWNhbnRseSwgYW5kIHRoZXJlZm9yZSBkZXRlcm1pbmUgd2hpY2ggcGxheWVyIG1hZGUgdGhlIGxhcmdlciBpbXBhY3QuDQoNCiMjIyBNYWpvciBGaW5kaW5ncyArIFNob3J0IFN1bW1hcnkgb2YgTXkgU3R1ZHkNCg0KQXMgYW4gYXZpZCBmYW4gb2Ygc3BvcnRzIGFuZCB0aGUgTkJBIGluIHBhcnRpY3VsYXIsIG15IGZhdm9yaXRlIHBsYXllciBiZXR3ZWVuIHRoZSB0d28gaXMgTWljaGFlbCBKb3JkYW4uIEhvd2V2ZXIsIEkgYXBwcm9hY2hlZCB0aGlzIGFuYWx5c2lzIGZhaXJseSBhbmQgb2JqZWN0aXZlbHkgdG8gc3RhdGlzdGljYWxseSBwcm92ZSB3aGljaCBwbGF5ZXIgaXMgdGhlIGdyZWF0ZXN0IG9mIGFsbCB0aW1lIGJhc2VkIG9uIHRoZSBzaWduaWZpY2FuY2Ugb2YgbWVhbiBwb2ludHMtcGVyLWdhbWUgc2NvcmVkLiBCeSBjb25kdWN0aW5nIHRoZSBUd28gU2FtcGxlIHQtdGVzdCwgaXQgd2FzIGRldGVybWluZWQgdGhhdCBNaWNoYWVsIEpvcmRhbiBpbmRlZWQgaGFkIGEgc2lnbmlmaWNhbnRseSBoaWdoZXIgbWVhbiBwb2ludHMtcGVyLWdhbWUgc2NvcmVkIG92ZXIgaGlzIGNhcmVlciB0aGFuIExlQnJvbiBKYW1lcyBjdXJyZW50bHkgaGFzLiBXaXRoIGEgcC12YWx1ZSAoMC4wMCkgbGVzcyB0aGFuIGFueSByZWFzb25hYmxlIGFscGhhIGxldmVsLCBpdCBpcyBkZXRlcm1pbmVkIHRoYXQgTWljaGFlbCBKb3JkYW4gaXMgb2ZmaWNpYWxseSB0aGUgRy5PLkEuVC4gb2YgcHJvZmVzc2lvbmFsIGJhc2tldGJhbGwhDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgSW50cm9kdWN0aW9uDQoNCiMjIyBRdWVzdGlvbiBvZiBJbnRlcmVzdA0KDQpMZUJyb24gSmFtZXMgdnMuIE1pY2hhZWwgSm9yZGFuDQp3aG8gaXMgdGhlIEdyZWF0ZXN0IG9mIEFsbCBUaW1lIChHLk8uQS5UKT8NCg0KIyMjIFdoeSBTaG91bGQgWW91IEJlIEludGVyZXN0ZWQ/DQoNClRoZXJlIGNhbiBiZSBtYW55IGdyZWF0cywgYnV0IG9ubHkgb25lIGFic29sdXRlIGdyZWF0ZXN0IG9mIGFsbCB0aW1lLiBGb3IgbXkgTkJBIGZhbnMsIHRoaXMgaXMgYSBmdW4gZGViYXRhYmxlIHRvcGljIHRoYXQgSSBmZWx0IHdvdWxkIGJlIGZ1biB0byBhbmFseXplIHN0YXRpc3RpY2FsbHkuDQoNCiMjIyBIb3cgSSBQbGFuIHRvIEFkZHJlc3MgdGhpcyBRdWVzdGlvbg0KDQpJIHdpbGwgdXRpbGl6ZSBjYXJlZXIgc3RhdHMgZm9yIGJvdGggTGVCcm9uIEphbWVzIGFuZCBNaWNoYWVsIEpvcmRhbiB0byBwZXJmb3JtIGEgVHdvIFNhbXBsZSB0LXRlc3QuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIFBlcnNvbmFsIEluZm9ybWF0aW9uDQoNCjxjZW50ZXI+DQoNCiFbXShNZS0yMDIxIS5qcGcpe3dpZHRoPTMwJX0NCg0KPC9jZW50ZXI+DQoNCkhlbGxvISBNeSBuYW1lIGlzIERlcnJpY2sgSm95Y2UgYW5kIEkgYW0gYSBncmFkdWF0aW5nIHNlbmlvciB3aXRoIGEgQmFjaGVsb3Igb2YgU2NpZW5jZSBpbiBDb21wdXRlciBFbmdpbmVlcmluZyB3aXRoIGEgbWlub3IgaW4gTWF0aGVtYXRpY2FsIFNjaWVuY2VzLiBJIGFtIGFuIGF2aWQgc3BvcnRzIGZhbiB3aGljaCB3YXMgbXkgaW5zcGlyYXRpb24gZm9yIHRoaXMgdG9waWMuIEkgcGxhbiB0byBzdGFydCBncmFkdWF0ZSBzY2hvb2wgdGhpcyB1cGNvbWluZyBmYWxsIHRvIHB1cnN1ZSBhIE1hc3RlcnMgaW4gUm9ib3RpY3MhDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQoNCiMgRGF0YSBNYW5hZ2VtZW50DQoNCiMjIERhdGEgTGlua3MNCltNaWNoYWVsIEpvcmRhbiBDYXJlZXIgU3RhdHNdKGh0dHBzOi8vd3d3LmJhc2tldGJhbGwtcmVmZXJlbmNlLmNvbS9wbGF5ZXJzL2ovam9yZGFtaTAxLmh0bWwpDQoNCltMZUJyb24gSmFtZXMgQ2FyZWVyIFN0YXRzXShodHRwczovL3d3dy5iYXNrZXRiYWxsLXJlZmVyZW5jZS5jb20vcGxheWVycy9qL2phbWVzbGUwMS5odG1sKQ0KDQojIyBEYXRhIENvbGxlY3Rpb24gTWV0aG9kDQoNCkZyb20gdGhlIGFib3ZlIGxpbmtzLCBJIGNvcGllZCB0aGUgc3RhdGlzdGljcyBmb3IgZWFjaCBnYW1lIHRoYXQgdGhlIHBsYXllciBwbGF5ZWQuIEkgaWdub3JlZCBnYW1lcyB3aGVyZSB0aGUgcGxheWVyIHdhcyBpbmp1cmVkIG9yIGluYWN0aXZlIGJlY2F1c2UgdGhleSBhcmUgbm90IHBoeXNpY2FsbHkgY29udHJpYnV0aW5nIHRvIHRoZSBnYW1lLg0KDQojIyBJbXBvcnQgUmF3IERhdGENCg0KYGBge3IgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkocnN0YXRpeCkNCmxpYnJhcnkoRFQpDQpgYGANCg0KIyMjIExlQnJvbiBKYW1lcyBDYXJlZXIgU3RhdHM6DQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KbGVicm9uID0gcmVhZF9leGNlbCgiTEVCUk9OX1NUQVRTLnhsc3giLCBza2lwID0gMSkNCg0KZGF0YXRhYmxlKGxlYnJvbikNCmBgYA0KDQoNCiMjIyBNaWNoYWVsIEpvcmRhbiBDYXJlZXIgU3RhdHM6DQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KbWogPSByZWFkX2V4Y2VsKCJNSl9TVEFUUy54bHN4Iiwgc2tpcCA9IDEpDQoNCmRhdGF0YWJsZShtaikNCmBgYA0KDQoNCiMjIFNlbGVjdCBHYW1lIE51bWJlciBhbmQgUFRTIChQb2ludHMpDQoNCiMjIyBMZUJyb24gSmFtZXMgUG9pbnRzIFBlciBHYW1lIChQUEcpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQoNCiNTZWxlY3QgR2FtZV9OdW1iZXIgYW5kIFBUUw0KbGVicm9uX3B0cyA9IGxlYnJvbiAlPiUNCiAgc2VsZWN0KEcsIFBUUykgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlKEdhbWVfTnVtYmVyID0gRywNCiAgICAgICAgICAgIExFQlJPTl9QVFMgPSBQVFMpDQoNCg0KZGF0YXRhYmxlKGxlYnJvbl9wdHMpDQoNCg0KYGBgDQoNCiMjIyBNaWNoYWVsIEpvcmRhbiBQb2ludHMgUGVyIEdhbWUgKFBQRykNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCg0KI1NlbGVjdCBHYW1lX051bWJlciBhbmQgUFRTDQptal9wdHMgPSBtaiAlPiUNCiAgc2VsZWN0KEcsIFBUUykgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlKEdhbWVfTnVtYmVyID0gRywNCiAgICAgICAgICAgIE1KX1BUUyA9IFBUUykNCg0KZGF0YXRhYmxlKG1qX3B0cykNCg0KYGBgDQoNCg0KDQojIyBKb2luIGJ5IEdhbWUgTnVtYmVyIFRvIEdldCBGaW5hbCBEYXRhIFRhYmxlDQoNCg0KYGBge3J9DQojaW5uZXIgam9pbiB0byBpbmNsdWRlIG9ubHkgdGhlIGdhbWVzIHRoYXQgZWFjaCBwbGF5ZWQNCnB0cyA9IGlubmVyX2pvaW4obWpfcHRzLCBsZWJyb25fcHRzLCBieSA9ICJHYW1lX051bWJlciIpICU+JQ0KICBzZWxlY3QoLUdhbWVfTnVtYmVyKQ0KDQpkYXRhdGFibGUocHRzKQ0KYGBgDQoNCg0KIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzDQoNCiMjIFBpdm90IERhdGENCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCg0KI1Bpdm90IHRoZSBkYXRhDQpwdHNfcGl2b3QgPSBwdHMgJT4lDQogIHBpdm90X2xvbmdlcigiTEVCUk9OX1BUUyI6Ik1KX1BUUyIsbmFtZXNfdG8gPSAiUGxheWVyIiwgdmFsdWVzX3RvID0gIlBUUyIpDQoNCmRhdGF0YWJsZShwdHNfcGl2b3QpDQpgYGANCg0KIyMgU3VtbWFyeSBTdGF0aXN0aWNzDQpgYGB7cn0NCg0KI0dhdGhlciBzdW1tYXJ5IHN0YXRpc3RpY3MNCnB0c19zdW1tYXJ5ID0gcHRzX3Bpdm90ICU+JQ0KICBncm91cF9ieShQbGF5ZXIpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSwNCiAgICAgICAgICAgIG1lYW4gPSBtZWFuKFBUUywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHNkID0gc2QoUFRTLCBuYS5ybSA9IFRSVUUpKQ0KDQprbml0cjo6a2FibGUocHRzX3N1bW1hcnkpDQoNCmBgYA0KDQpUaGlzIHN0dWR5IGFuYWx5emVzIDEwMjAgZ2FtZXMgcGxheWVkIGJ5IExlQnJvbiBKYW1lcyBhbmQgTWljaGFlbCBKb3JkYW4uIFRoZSBtZWFuIHBvaW50cy1wZXItZ2FtZSBzY29yZWQgYnkgTGVCcm9uIGlzIGFwcHJveGltYXRlbHkgMjcuMTggYW5kIE1pY2hhZWwncyBpcyAzMC4yMi4gRnJvbSBhIHN1cmZhY2UgbGV2ZWwgdmlldywgaXQgaXMgY2xlYXIgdGhhdCBNaWNoYWVsIGhhZCBhIGhpZ2hlciBhdmVyYWdlIHBvaW50cy1wZXItZ2FtZSBzY29yZWQsIGJ1dCB0aGUgcXVlc3Rpb24gcmVtYWluczogaXMgaXQgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2U/IEluIHRoZSBjb250ZXh0IG9mIGEgYmFza2V0YmFsbCBnYW1lLCBhIDMgcG9pbnQgZGVmaWNpdCBpcyBhIHNtYWxsIG1hcmdpbi4gSG93ZXZlciwgaW4gdGhlIGNvbnRleHQgb2Ygc3RhdGlzdGljcywgdGhlIHNpZ25pZmljYW5jZSBpcyB5ZXQgdG8gYmUgZGV0ZXJtaW5lZC4gTmV4dCB3ZSB3aWxsIHZpc3VhbGl6ZSB0aGUgZGF0YSB0byBnZXQgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGlzdHJpYnV0aW9uLg0KDQoNCiMjIERhdGEgVmlzdWFsaXphdGlvbnMNCg0KIyMjIEhpc3RvZ3JhbQ0KDQpgYGB7cn0NCg0KI2hpc3RvZ3JhbQ0KaGlzdCA8LSBwdHNfcGl2b3QgJT4lDQogIGdncGxvdChtYXBwaW5nPWFlcyh4ID0gUFRTLCBmaWxsPVBsYXllcikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1KSANCg0KaGlzdA0KDQpgYGANCg0KRnJvbSB0aGUgaGlzdG9ncmFtLCBpdCBpcyBjbGVhciB0aGF0IGFsdGhvdWdoIE1pY2hhZWwgSm9yZGFuIGhhcyBhIHNsaWdodGx5IGhpZ2hlciBtZWFuIHBvaW50cy1wZXItZ2FtZSB0aGFuIExlQnJvbiBKYW1lcywgTGVCcm9uIGhhcyBhIG11Y2ggaGlnaGVyIHBvaW50IHRvdGFsIHRoYW4gTWljaGFlbCB0aHJvdWdob3V0IHRoZSBzYW1wbGUgMTAyMCBnYW1lcy4gVGhpcyByYWlzZXMgdGhlIHF1ZXN0aW9uOiBIb3cgY291bGQgTGVCcm9uIGhhdmUgbW9yZSB0b3RhbCBwb2ludHMgYnV0IGEgc21hbGxlciBtZWFuIG92ZXJhbGw/IFRoaXMgaXMgYmVjYXVzZSB0aGUgZGF0YSBhbmFseXplcyBwb2ludHMtcGVyLWdhbWUsIG5vdCB0b3RhbCBwb2ludHMgc2NvcmVkLiBUaGlzIGluZGljYXRlcyB0aGF0IExlQnJvbiBtYXkgaGF2ZSBtYW55IG91dGxpZXJzIChnYW1lcyB3aGVyZSBoZSBzY29yZWQgbXVjaCBtb3JlIG9yIG11Y2ggbGVzcyB0aGFuIG5vcm1hbCkuIFRoZXJlZm9yZSB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBMZUJyb24gaGFzIHNjb3JlZCBtdWNoIG1vcmUgcG9pbnRzIG92ZXJhbGwsIGJ1dCBvbiBhIHBlci1nYW1lIGJhc2lzLCBNaWNoYWVsIEpvcmRhbiBoYXMgdGhlIGhpZ2hlciBhdmVyYWdlIHBvaW50IHRvdGFsLg0KDQoNCiMjIyBCb3hwbG90DQoNCmBgYHtyfQ0KIyBib3hwbG90DQpicCA8LSBwdHNfcGl2b3QgJT4lDQogIGdncGxvdChtYXBwaW5nPWFlcyh4PVBUUywgZmlsbD1QbGF5ZXIpKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG9yID0gIiNGNTY2MDAiLCANCiAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDMuMCkgDQpicA0KYGBgDQoNCkEgc2ltaWxhciBjb25jbHVzaW9uIGNhbiBiZSBkcmF3biBmcm9tIHRoZSBib3hwbG90LiBXaGF0IHdlIGNhbiBjbGVhcmx5IHNlZSBpcyB0aGUgaGlnaCBudW1iZXIgb2Ygb3V0bGllcnMgZm9yIExlQnJvbidzIHBvaW50IHRvdGFscyB3aGljaCBjb3VsZCBiZSBza2V3aW5nIHRoZSBkYXRhLiBUaGVzZSBvdXRsaWVycyBhcmUgcmVhc29uYWJsZSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYmFza2V0YmFsbCBiZWNhdXNlIHBsYXllciBwZXJmb3JtYW5jZSB2YXJpZXMgdGhyb3VnaG91dCB0aGUgc2Vhc29uIGR1ZSB0byBudW1lcm91cyBleHRlcm5hbCBmYWN0b3JzLiBIb3dldmVyLCBpdCBpcyBzdGlsbCBjbGVhciB0aGF0IE1pY2hhZWwgSm9yZGFuIHJldGFpbnMgdGhlIGhpZ2hlciBtZWFuIHBvaW50cy1wZXItZ2FtZS4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gbm90ZSBiZWNhdXNlIExlQnJvbiBKYW1lcyBwbGF5ZWQgbW9yZSBnYW1lcyB0b3RhbCB0aGFuIE1pY2hhZWwgSm9yZGFuIHNvIGFuYWx5emluZyBtZWFuIHBvaW50cy1wZXItZ2FtZSBpcyBhIG1vcmUgYWNjdXJhdGUgcmVwcmVzZW50YXRpb24gdGhhbiBzaW1wbHkgdG90YWwgcG9pbnRzIHNjb3JlZC4NCg0KIyMjIFFRUGxvdA0KDQpgYGB7cn0NCiMgcXEgcGxvdA0KZ2dxcXBsb3QocHRzX3Bpdm90LCB4PSJQVFMiLCBmYWNldC5ieSA9ICJQbGF5ZXIiKQ0KDQpgYGANCg0KVGhlIFFRUGxvdCBjb25maXJtcyB0aGF0IGJvdGggZGF0YXNldHMgZm9sbG93IGFuIGFwcHJveGltaWF0ZWx5IG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZXJlIGlzIGluc3VmZmljaWVudCBldmlkZW5jZSB0byBzdWdnZXN0IG90aGVyd2lzZS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgQW5hbHlzaXMNCg0KIyMgUGVyZm9ybSBUd28gU2FtcGxlIFQgVGVzdA0KDQokJCBIXzA6IFxtdV8xID0gXG11XzIgJCQNCg0KJCQgSF9BOiBcbXVfMSBcbmUgXG11XzIgJCQNCg0KYGBge3J9DQoNCiMgcGVyZm9ybSB0IHRlc3QNCnRlc3QgPC0gcHRzX3Bpdm90ICU+JSANCiAgdF90ZXN0KFBUUyB+IFBsYXllcikgJT4lDQogIGFkZF9zaWduaWZpY2FuY2UoKQ0KDQojIG5pY2UgcHJpbnQgb2Ygb3V0cHV0DQprbml0cjo6IGthYmxlKHRlc3QsIGFsaWduPSJjIiwgZm9ybWF0ID0gImh0bWwiKSAlPiUNCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpDQoNCmBgYA0KT3V0IG9mIHRoZSBzYW1wbGUgMTAyMCBnYW1lcyBhbmFseXplZCBieSBlYWNoIHBsYXllciwgSSBwZXJmb3JtZWQgYSBoeXBvdGhlc2lzIHRlc3QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtZWFuIHBvaW50cy1wZXItZ2FtZSBzY29yZWQgYnkgTWljaGFlbCBKb3JkYW4gYW5kIExlQnJvbiBKYW1lcyB3ZXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGluIGEgc3RhdGlzdGljYWwgcG9pbnQtb2Ytdmlldy4gVGhlIHJlc3VsdGluZyBwLXZhbHVlIGlzIDAuMDAgd2hpY2ggaXMgbXVjaCBsb3dlciB0aGFuIGEgcmVhc29uYWJsZSBhbHBoYSBsZXZlbC4NCg0KIyBTdW1tYXJ5DQoNCkEgdHdvLXNhbXBsZSB0LXRlc3Qgd2FzIGNvbXB1dGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwb3B1bGF0aW9uIG1lYW4gcG9pbnRzLXBlci1nYW1lIGJ5IE1pY2hhZWwgSm9yZGFuIHdhcyBzaWduaWZpY2FudGx5IGhpZ2hlciBmcm9tIHRoZSBwb3B1bGF0aW9uIG1lYW4gcG9pbnRzLXBlci1nYW1lIGJ5IExlQnJvbiBKYW1lcy4NCg0KU2luY2UgdGhlIHAtdmFsdWUgKDApIGlzIGxlc3MgdGhhbiBhbnkgcmVhc29uYWJsZSBhbHBoYSBsZXZlbCwgd2UgcmVqZWN0IG91ciBudWxsIGh5cG90aGVzaXMuIFRoZXJlIElTIHN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gc3VnZ2VzdCB0aGF0IHRoZSBwb3B1bGF0aW9uIG1lYW4gcG9pbnRzLXBlci1nYW1lIHNjb3JlZCBieSBNaWNoYWVsIEpvcmRhbiBpcyBzaWduaWZpY2FudGx5IGdyZWF0ZXIgdGhhbiB0aGUgcG9wdWxhdGlvbiBtZWFuIHBvaW50cy1wZXItZ2FtZSBzY29yZWQgYnkgTGVCcm9uIEphbWVzLg0KDQo8Y2VudGVyPg0KDQohW10oSm9yZGFuTGVicm9uU3RhdHNfR2V0dHlfUmluZ2VyLjAucG5nKXt9DQoNCjwvY2VudGVyPg0KDQojIFJlZmVyZW5jZXMNCg0KaHR0cHM6Ly93d3cuYmFza2V0YmFsbC1yZWZlcmVuY2UuY29tL3BsYXllcnMvai9qb3JkYW1pMDEuaHRtbA0KDQpodHRwczovL3d3dy5iYXNrZXRiYWxsLXJlZmVyZW5jZS5jb20vcGxheWVycy9qL2phbWVzbGUwMS5odG1sDQo=